#include <cstdlib>//UVALive 5687 2011-10-29 11:08:54 
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <ctime>
using namespace std;
typedef long long ll;
#define clr(x,a) memset(x,a,sizeof(x))
#define sz(x) (int)x.size()
#define see(x) cerr<<#x<<" "<<x<<endl
#define se(x) cerr<<" "<<x 
#define pb push_back
#define mk make_pair
#define X first
#define Y second
const int maxn=1000001;
int n,m;
int rd() {int x;scanf("%d",&x);return x;}
/***************hash表模版，支持多个hash表*************************/
//hash模版
const int mod=1000001;
int hs[maxn],start[maxn],next[maxn*3],M;//hs是第一个hs表，start是第二个hash表，next是hash的链表法的指针
struct node//存入每个节点的信息
{
	char s[40];//字符串是什么
	int num;//字符串出现的次数
}E[100000*3];

char ch[100000][34];


void init()//hash表初始化
{
	M=-1;
	clr(hs,-1);
	clr(start,-1);
}
//查找某个hash表里面有无某个串
int find(int *first,int hash,char *s)
{
	int i,j,tp=-1,e;
	for(e=first[hash]; e!=-1; e=next[e])
	{
		if(strcmp(E[e].s,s)==0)
			return e;
	}
	return -1;
}
//将某个串插入hash表中
void insert(int *first,int hash,char *s)
{
	int i,j,k;
	int tp=find(first,hash,s);//先查有没有
	if(tp==-1)
	{
		M++;
		next[M]=first[hash];
		first[hash]=M;
		strcpy(E[M].s,s);
		E[M].num=1;
	}
	else
	{
		E[tp].num++;
	}
}
unsigned int gethash(char *str)//hash表
{
	unsigned int hash=0;
	unsigned int x=0;
	while(*str)
	{
		hash=(hash<<4)+(*str++);
		if((x=hash&0xF0000000L)!=0)
		{
			hash^=(x>>24);
			hash&=~x;	
		}
	}
	return hash%mod;
}

/***************hash表模版****************************/
char s[100];
int main()
{
	//freopen("in","r",stdin);
	int i,j,k;
	while(scanf("%d", &n),n)
	{
	/***************hash表模版****************************/
		init();
	/***************hash表模版****************************/
		for(i=0; i<n; i++)
		{
			scanf("%s",&ch[i][0]);
			/***************hash表模版****************************/
			insert(hs,gethash(ch[i]),ch[i]);
			/***************hash表模版****************************/
		}
		for(i=0; i<n; i++)
		{
			int len=strlen(&ch[i][0]);
			for(j=0; j<len-1;j ++)
			{
				s[j]=ch[i][j];
				s[j+1]=0;
		/***************hash表模版****************************/
				if(find(hs,gethash(s),s)!=-1)
				{
					insert(start,gethash(&ch[i][j+1]),&ch[i][j+1]);
				}
		/***************hash表模版****************************/
			}
		}
		int tp;
		ll ans=0;
		for(i=0; i<n; i++)
		{
			int len=strlen(&ch[i][0]);
			for(j=0; j<len-1;j ++)
			{
				s[j]=ch[i][j];
				s[j+1]=0;
				if(find(hs,gethash(&ch[i][j+1]),&ch[i][j+1])!=-1)
				{
					tp=find(start,gethash(s),s);
					if(tp!=-1)
					{
						ans+=(ll)E[tp].num;
					}
				}
			}
		}
		cout<<ans<<endl;
	}
}

